home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d17 / lptcom02.arc / LPTCOM.ASM next >
Assembly Source File  |  1988-04-19  |  5KB  |  174 lines

  1.     PAGE    60, 80
  2. TITLE    LPTCOM    15-APR-88    XON/XOFF Printer Interface on COM
  3.  
  4. ;-----------------------------------------------------------------------|
  5. ;                                    |
  6. ;    XON/XOFF Printer Interface                    |
  7. ;        Installed as "terminate and stay resident" program    |
  8. ;                                    |
  9. ;-----------------------------------------------------------------------|
  10. ;    REVISION HISTORY                        |
  11. ;                                    |
  12. ; Number    DD-MMM-YY             WHO                     WHY        |
  13. ;-------|---------------|-----------------------|-----------------------|
  14. ; 0.1   |   01-Apr-88   | Frank Waldner         | Initial release       |
  15. ;-----------------------------------------------------------------------|
  16.  
  17. COM1    EQU     03F8H                   ; Base address COM1
  18. COM2    EQU     02F8H                   ; Base address COM2
  19. COMport EQU     COM1                    ; Use COM1
  20.  
  21. RBRport    EQU    COMport            ; Receiver Buffer Register      xx8
  22. IERport    EQU    COMport+1        ; Interrupt Enable Register     xx9
  23. IIRport    EQU    COMport+2        ; Interrupt ID Register         xxA
  24. MCRport    EQU    COMport+4        ; Modem Control Register        xxC
  25. LSRport    EQU    COMport+5        ; Line Status Register          xxD
  26. MSRport    EQU    COMport+6        ; Modem Status Register         xxE
  27. THRport EQU    RBRport            ; Transmit Holding Register     xx8
  28.  
  29. RBF     EQU     1                       ; Receive Buffer Full
  30. THRE    EQU    20H            ; Transmit Holding Register Empty
  31.  
  32. XOFF    EQU    'S' - 40H
  33. XON    EQU    'Q' - 40H
  34.  
  35. CR      EQU     0DH
  36. LF      EQU     0AH
  37.  
  38. ;-----------------------------------------------------------------------|
  39. ;    The Usual Stuff                            |
  40. ;-----------------------------------------------------------------------|
  41.  
  42. cGroup    Group    Code
  43.  
  44. Code    Segment Public 'Code'
  45.  
  46.     Assume    CS:Code, DS:Code, ES:Code, SS:Code
  47.  
  48.     Org    100H
  49.  
  50. LPTCOM:
  51.     
  52. JMP    Install             ; install traps
  53.  
  54.     PAGE
  55. ;-----------------------------------------------------------------------|
  56. ;    Printer interrupt handler                    |
  57. ;                                    |
  58. ;    ENTRY :    as for printer interrupt (INT 17H)            |
  59. ;                                                                       |
  60. ;       (AH)=0  Print character in AL on Err AH = 1                     | 
  61. ;       (AH)=1  Init printer port            AH = Printer Status        | 
  62. ;       (AH)=2  Read printer status          AH = Printer Status        | 
  63. ;                                                                       | 
  64. ;       (DX) = Printer number (0,1,2,etc.)                              | 
  65. ;                                    | 
  66. ;    EXIT :    ditto                            |
  67. ;                                    |
  68. ;-----------------------------------------------------------------------|
  69.  
  70. Handler    Proc    Far
  71.  
  72.     STI
  73.     TEST    AH,AH            ; output request ??
  74.     JNZ    Hand3            ; if NZ: return status
  75.  
  76. Hand1:
  77.     PUSH    BX            ; (+1) save
  78.     PUSH    DX            ; (+2)
  79.     MOV    BL,AL            ; save char
  80. Hand1a:
  81.     MOV    DX,LSRport
  82.  
  83. Hand2:
  84.     IN    AL,DX            ; get line status
  85.         TEST    AL,RBF                  ; receive buffer full ?
  86.         JZ      Hand2a                  ; if z, no
  87.  
  88.         MOV     DX,RBRport              ; else point to RB port
  89.         IN      AL,DX                   ; get char
  90.     AND    AL,7FH                  ; filter to 7 bits
  91.  
  92.     CMP    AL,XOFF                 ; was XOFF received ?
  93.         JNE     Hand1a                  ; if ne, no reason to stop
  94. Xpause:
  95.         MOV     DX,LSRport              ; point to LS port
  96. Xwait:
  97.         IN      AL,DX                   ; get line status
  98.         TEST    AL,RBF                  ; receive buffer full ?
  99.         JZ      Xwait                   ; if z, no, wait some more
  100.  
  101.         MOV     DX,RBRport              ; point to RB port
  102.         IN      AL,DX                   ; get char
  103.         AND     AL,7FH                  ; filter to 7 bits
  104.     CMP    AL,XON                  ; was XON received ?
  105.         JNE     Xpause                  ; if ne, something else
  106.         JMP     Hand1a                  ; try again
  107. Hand2a:
  108.     TEST    AL,THRE            ; transmit holding register empty ??
  109.     JZ    Hand2            ; if Z: uart not ready yet, loop
  110.  
  111.     MOV    AL,BL
  112.     MOV    DX,THRport        ; transmit port
  113.     OUT    DX,AL            ; transmit
  114.  
  115.     POP    DX            ; (+1) restore
  116.     POP    BX            ; (+0)
  117.  
  118. Hand3:
  119.     MOV    AH,90H
  120.     IRET
  121.  
  122. Handler    EndP
  123.  
  124.     PAGE
  125. ;-----------------------------------------------------------------------|
  126. ;    XON/XOFF Printer Interface                    |
  127. ;                                    |
  128. ;    ENTRY :    normal COM program entry                |
  129. ;                                    |
  130. ;    EXIT :    Terminate / Stay Resident                |
  131. ;                                    |
  132. ;-----------------------------------------------------------------------|
  133.  
  134. Install    Proc    Near
  135.  
  136.     MOV    DX,Offset Handler    ; first take over INT 17 vector
  137.     MOV    AX,2517H
  138.     INT    21H
  139.  
  140.         CLI
  141.  
  142.     MOV    DX,MCRport        ; get status of MCR
  143.     IN    AL,DX
  144.     OR    AL,0FH            ; set DTR, RTS, OUT1, OUT2
  145.     OUT    DX,AL            ; init MCR
  146.  
  147.     MOV    DX,LSRport        ; clear pending status
  148.     IN    AL,DX
  149.     MOV    DX,RBRport
  150.     IN    AL,DX
  151.     MOV    DX,IIRport
  152.     IN    AL,DX
  153.     MOV    DX,MSRport
  154.     IN    AL,DX
  155.  
  156.     STI
  157.  
  158.         MOV     AH,09                   ; DOS9 = Print string
  159.         MOV     DX,Offset Insmsg        ; DS:DX -> message
  160.         INT     21H                     ; DOSint
  161.  
  162.     MOV    DX,Offset Install    ; DS:DX -> end of "keep" area
  163.     INT    27H            ; terminate / stay resident
  164.  
  165. Install    EndP
  166.  
  167. Insmsg  DB      CR,LF,'LPT: redirected to COM'
  168.         DB      '2'-((COMport-COM2)/100H)
  169.         DB      ':',CR,LF,'$'
  170.  
  171. Code    EndS
  172.  
  173.     END    LPTCOM            ; of LPTCOM
  174.